/*
 * @Descripttion: unTitle
 * @Author: yizheng.yuan
 * @Date: 2021-11-16 10:56:43
 * @LastEditors: yizheng.yuan
 * @LastEditTime: 2021-11-16 16:26:02
 */
const express = require('express')
const app = express()
const fs = require('fs')
var Path = require('path')
const port = 3000;
const host = 'localhost'
const serverUrl = `${host}:${port}`;
let filePath = Path.resolve(__dirname,'db.json');
const imgFolder='./tmp/'


// 要安装这个插件 body-parser 来接收参数 npm i body-parser
const bodyParser = require('body-parser')

//拦截所有的请求，对post请求做出处理，把参数存在req.body中
//extended:false 方法内部使用querysyring模块处理请求参数的格式
app.use(bodyParser.json());//返回一个只解析json的中间件，最后保存的数据都放在req.body对象上
app.use(bodyParser.urlencoded({ extended: true }));//返回的对象为任意类型


// 设置允许跨域访问
app.all('*', (req, res, next) => {
  // console.log("进来了---",req.headers)
  res.header("Access-Control-Allow-Origin", "*");
  // res.header("Access-Control-Allow-Headers", '*');
  res.header("Access-Control-Allow-Headers", "token");
  // res.header("Access-Control-Allow-Headers", "content-type");

  // res.header("Access-Control-Allow-Headers", "X-Requested-With");
  // res.header("Access-Control-Allow-Headers", "content-type,Authorization");
  // res.header("Access-Control-Allow-Credentials", true)

  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  res.header("X-Powered-By", ' 3.2.1')
  // 这一句会导致图片等静态资源返回异常 所以不能写在这里
  // res.header("Content-Type", "application/json;charset=utf-8");
  next();
});


// 统一返回格式
function getBackData(isRight = true) {
  var gRel = {
    error: 0,
    msg: 'success',
    data: ''
  };
  var ngRel = {
    error: 1,
    msg: 'error',
    data: ''
  };
  if (isRight) {
    return JSON.parse(JSON.stringify(gRel))
  } else {
    return JSON.parse(JSON.stringify(ngRel))
  }
}

// -------------- 图片文件上传处理 start --------------------
// 读取静态资源
app.use(express.static('./'))
// 引入multer中间件，用于处理上传的文件数据
const multer = require('multer')
// 通过配置multer的dest属性， 将文件储存在项目下的tmp文件中
app.use(multer({ dest: './tmp/' }).any())
// 原文链接：https://blog.csdn.net/huang100qi/article/details/104083949

// 保存数据
function saveActive(obj, action='add'){
  console.log('filePath',filePath);
  let content = fs.readFileSync(filePath).toString()
  try {
    if(content){
      content = JSON.parse(content)
      if(action == 'add'){
        content.push(obj)
      } else{
        // 更新
        for(let i=0;i<content.length;i++){
          if(content[i].id == obj.id){
            if(action == 'update'){
              content.splice(i,1,obj)
            } else if(action == 'delete'){
              content.splice(i,1)
            }
            break;
          }
        }
      }
      // 写回文件中 
      // JSON.stringify(content, null, 2) 格式化写入json
      fs.writeFileSync(filePath, JSON.stringify(content, null, 2))
      return 'ok'
    }
  } catch (error) {
    return error;
  }
}

function getRealUrl(filename){
  let str = Path.join(serverUrl, filename);
  // window的路径分割符 Path.sep 为反双斜杠 \\  此处要改为 单斜杠 /
  let url = str.split(Path.sep).join('/')
  url = 'http://' + url
  return url;
}

// 文件上传接口
app.post('/fileUpload', async function (req, res) {
  // 上传的文件在req.files中
  try {
    console.log('接收到图片上传数据:', req.body, req.files);
    let allUrl = []
    // 可能有多张图片
    let arr = req.files;
    for (let i = 0; i < arr.length; i++) {
      // 修改图片文件名
      let now = Date.now();
      let filename = arr[i].originalname;
      if (arr[i].originalname.includes('.')) {
        let nameArr = arr[i].originalname.split('.')
        filename = `${nameArr[0]}_${now}.${nameArr[1]}`;
      }
      filename = arr[i].destination + filename;
      console.log('默认名1：', arr[i].path);
      console.log('改名：', filename);
      fs.renameSync(arr[i].path, filename)
      console.log('改名成功：', i);
      let url = getRealUrl(filename)
      allUrl.push({
        id: arr[i].fieldname,
        url,
      })
    }
    // 解构参数
    // 是否新增
    let { isAdd, username, poster } = req.body;
    delete req.body.isAdd;
    // 是更新
    let _id = ''
    if (isAdd != 'isAdd' && arr.length > 0) {
      _id = req.body._id;
      delete req.body._id;
      // 删除旧图片
      deleteImgFun(poster)
    }
    // console.log('req.body',req.body);
    let obj = Object.assign({}, req.body)
    if (allUrl.length > 0) {
      obj.poster = allUrl[0].url
    } else {
      let filename = imgFolder+obj.poster
      obj.poster = getRealUrl(filename)
    }
    let msg = 'Add success';
    if (isAdd == 'isAdd') {
      await saveActive(obj) // 保存数据到文件里 （数据库）
    } else {
      // 更新
      await saveActive(obj, 'update') // 保存数据到文件里 （数据库）
      // 日志
      msg = 'Update success';
    }

    // 响应前端信息
    let rel = getBackData()
    rel.msg = msg
    rel.data = ''
    res.send(rel)
  } catch (error) {
    let msg = 'error';
    console.log('error:', error);
    if (typeof error === 'object') {
      msg = JSON.stringify(error).slice(0, 50)
    }
    let rel = getBackData(false)
    rel.msg = msg
    res.send(rel)
  }
});
// -------------- 图片文件上传处理 end --------------------

// 删除图片函数
function deleteImgFun(poster) {
  // 找出所有图片
  let arr = fs.readdirSync(Path.resolve(__dirname, 'tmp'))
  console.log('fileArr', arr);
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] == poster) {
      fs.unlinkSync(Path.resolve(__dirname, 'tmp', arr[i]))
      break;
    }
  }
}

// 获取活动数据
app.get('/getActiveList',(req,res)=>{
  try {
    let gRel = getBackData(true)
    let content = fs.readFileSync(filePath).toString()
    let data=''
    if(content){
      data = JSON.parse(content)
    }
    gRel.data= data;
    gRel.msg = '获取成功'
    res.send(gRel)
  } catch (error) {
    let gRel = getBackData(false)
    gRel.data = error;
    res.send(gRel)
  }
})

// 删除活动数据
app.post('/delActive', async (req, res) => {
  console.log('body:', req.body);
  let { id, poster } = req.body;
  // 删除图片
  if (poster) {
    deleteImgFun(poster)
  }
  // 删除数据库数据
  try {
    await saveActive(req.body, 'delete') // 保存数据到文件里 （数据库）
    let ngRel = getBackData(true)
    ngRel.msg = '删除成功'
    res.send(ngRel)
  } catch (error) {
    let gRel = getBackData(false)
    gRel.msg = '删除失败'
    gRel.data = error;
    res.send(gRel)
  }
})

// 参考网址：https://blog.csdn.net/weixin_44376122/article/details/109772367?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.no_search_link

app.get('/', (req, res) => {
  res.send('Hello World12!')
})


app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})